package services

import (
	"errors"
	"stacks/config"
	"stacks/database"
	"stacks/models"
	"stacks/utils"
)

// AuthService 认证服务
type AuthService struct {
	cfg *config.Config
}

// NewAuthService 创建认证服务实例
func NewAuthService(cfg *config.Config) *AuthService {
	return &AuthService{cfg: cfg}
}

// Login 用户登录
func (s *AuthService) Login(username, password string, tenantID uint) (string, error) {
	var user models.SysUser
	err := database.GetDB().Where("username = ?", username).First(&user).Error
	if err != nil {
		return "", errors.New("用户名或密码错误")
	}

	if user.Status == 0 {
		return "", errors.New("用户已被禁用")
	}

	// 这里简化密码验证，实际应该使用加密验证
	if user.Password != password {
		return "", errors.New("用户名或密码错误")
	}

	// 生成JWT Token
	token, err := utils.GenerateToken(user.ID, user.Username, user.TenantID, s.cfg.JWT.Secret, s.cfg.JWT.Expire)
	if err != nil {
		return "", errors.New("生成Token失败")
	}

	return token, nil
}

// Register 用户注册
func (s *AuthService) Register(username, password, email string, tenantID uint) error {
	// 检查用户名是否已存在
	var existingUser models.SysUser
	err := database.GetDB().Where("username = ? AND tenant_id = ?", username, tenantID).First(&existingUser).Error
	if err == nil {
		return errors.New("用户名已存在")
	}

	// 检查邮箱是否已存在
	if email != "" {
		err = database.GetDB().Where("email = ? AND tenant_id = ?", email, tenantID).First(&existingUser).Error
		if err == nil {
			return errors.New("邮箱已存在")
		}
	}

	// 创建用户
	user := models.SysUser{
		TenantModel: models.TenantModel{
			TenantID: tenantID,
		},
		Username: username,
		Password: password, // 实际应该加密存储
		Email:    email,
		Status:   1,
	}

	return database.GetDB().Create(&user).Error
}
